﻿/*=======================================================================
(c) Topbot, 2009 http://ya.topbot.ru
=======================================================================*/

namespace RssToolkit.Rss
{
    using System;
    using System.Xml.Serialization;
    ///классы по сериализации

    /// <summary>
    /// RssItemYandex для разбора ответов Яндекс поиска по блога
    /// </summary>
    /// <seealso cref="http://blogs.yandex.ru/faq/entriesapi"/>
    [Serializable]
    [XmlRoot("item")]
    public class RssItemYandex:RssItem
    {
        #region urn:yandex-blogs

        /*
        /// <remarks>reserved</remarks>
        [XmlElement("visits", Namespace = "urn:yandex-blogs")]
        public int YaVisits { get; set; }
       */

        /// <summary>
        /// примерное количество посетителей записи.
        /// </summary>
        [XmlElement("visits24", Namespace = "urn:yandex-blogs")]
        public int YaVisits24 { get; set; }

        /// <summary>
        /// общее количество ссылок на запись за всё время её существования,
        /// </summary>
        [XmlElement("links", Namespace = "urn:yandex-blogs")]
        public int YaLinks { get; set; }

        /// <summary>
        /// количество ссылок на запись,
        /// </summary>
        [XmlElement("links24", Namespace = "urn:yandex-blogs")]
        public int YaLinks24 { get; set; }

        /// <summary>
        /// взвешенное количество ссылок на запись за всё время её существования,
        /// </summary>
        [XmlElement("linksweight", Namespace = "urn:yandex-blogs")]
        public double YaLinksWeight { get; set; }

        /// <summary>
        /// взвешенное количество ссылок на запись (с отфильтрованными накрутками и спамными ссылками),
        /// </summary>
        [XmlElement("links24weight", Namespace = "urn:yandex-blogs")]
        public double YaLinks24Weight { get; set; }

        /// <summary>
        /// общее количество комментариев к записи за всё время её существования,
        /// </summary>
        [XmlElement("comments", Namespace = "urn:yandex-blogs")]
        public int YaComments { get; set; }

        /// <summary>
        /// количество комментариев к записи,
        /// </summary>
        [XmlElement("comments24", Namespace = "urn:yandex-blogs")]
        public int YaComments24 { get; set; }

        /// <summary>
        /// количество разных русскоязычных комментаторов у записи за всё время её существования,
        /// </summary>
        [XmlElement("commenters", Namespace = "urn:yandex-blogs")]
        public int YaCommenters { get; set; }

        /// <summary>
        /// количество разных русскоязычных комментаторов у записи,
        /// </summary>
        [XmlElement("commenters24", Namespace = "urn:yandex-blogs")]
        public int YaCommenters24 { get; set; }

        /// <summary>
        /// Имя блога
        /// </summary>
        ///<remarks>Undocumented</remarks>
        [XmlElement("ppb_username", Namespace = "urn:yandex-blogs")]
        public String RealBlogName { get; set; }

        /// <summary>
        /// Имя блога
        /// </summary>
        ///<remarks>Undocumented</remarks>
        [XmlElement("journal", Namespace = "urn:yandex-blogs")]
        public String Journal
        {
            get
            {
                return RealBlogName;
            }
            set
            {
                RealBlogName = value;
            }
        }

        /// <summary>
        /// An entity responsible for making the resource available.
        /// </summary>
        /// <remarks>Examples of a Publisher include a person, an organization, or a service. 
        /// Typically, the name of a Publisher should be used to indicate the entity.</remarks>
        [XmlElement("publisher", Namespace = "http://purl.org/dc/elements/1.1/")]
        public String Publisher { get; set; }

        /// <summary>
        /// Имя того, кто оставил клмментарий, если у нас комментарий
        /// </summary>
        ///<remarks>Undocumented</remarks>
        [XmlElement("author", Namespace = "urn:yandex-blogs")]
        public String CommentBy { get; set; }

        /// <summary>
        /// Комментарий ли это
        /// Используется самодельная хитрость
        /// </summary>
        ///<remarks>Undocumented</remarks>
        [XmlElement("is-comment", Namespace = "urn:yandex-blogs",IsNullable=true)]
        public String IsComment { get { return _iscomment?"":null; } set { _iscomment = true; } }

        private Boolean _iscomment = false;

        #endregion

        #region http://www.livejournal.org/rss/lj/1.0/

        /// <summary>
        /// Количество комментариев для записи. Работает только в ЖЖ.
        /// </summary>
        [XmlElement("reply-count", Namespace = "http://www.livejournal.org/rss/lj/1.0/")]
        public int ReplyCount
        {
            get { return CommentsCount; }
            set { CommentsCount = value; }
        }

        /// <summary>
        /// Нули не сериализуем
        /// </summary>
        /// <returns></returns>
        public bool ShouldSerializeReplyCount()
        {
            return ReplyCount != 0;
        }

        /// <summary>
        /// Тип доступа к записи аналогичен PostType. Работает только в ЖЖ.
        /// </summary>
        [XmlElement("security", Namespace = "http://www.livejournal.org/rss/lj/1.0/", IsNullable = true)]
        public string Security { get; set; }

        #endregion

        #region YouTube

        /// <summary>
        /// Количество просмотров видео 
        /// </summary>
        ///<remarks><yt:statistics favoriteCount='3540' viewCount='1589955'/></remarks>
        [XmlElement("statistics", Namespace = "http://gdata.youtube.com/schemas/2007")]
        public YouTubeStatistics ytStats
        {
            get { return null; }
            set { 
                YaLinks = YaLinks24 = value.favoriteCount;
                YaVisits24 = value.favoriteCount;
            }
        }

        [XmlElement("group", Namespace = "http://search.yahoo.com/mrss/")]
        public YouTubeGroup ytGroup
        {
            get { return null; }
            set
            {
                if (!String.IsNullOrEmpty(value.Title))
                {
                    Title = value.Title;
                }
                if (!String.IsNullOrEmpty(value.Description) && value.Category != null &&
                    !String.IsNullOrEmpty(value.Keywords))
                {
                    Description =
                        (value.Description + " " + String.Join(" ,", value.Category) + " " + value.Keywords).Trim();
                }
            }
        }

        #endregion

        #region http://purl.org/rss/1.0/modules/slash/

        /// <summary>
        /// Количество комментариев для записи. Работает во многих RSS
        /// </summary>
        [XmlElement("comments", Namespace = "http://purl.org/rss/1.0/modules/slash/")]
        public int CommentsCount { get; set; }

        /// <summary>
        /// Нули не сериализуем
        /// </summary>
        /// <returns></returns>
        public bool ShouldSerializeCommentsCount()
        {
            return CommentsCount != 0;
        }

        #endregion

        #region Media

        /// <summary>
        /// Media attachment
        /// </summary>
        [XmlElement("content", Namespace = "http://search.yahoo.com/mrss/")]
        public Media MediaContent { get; set; }


        /// <summary>
        /// Media Thumbnail
        /// </summary>
        [XmlElement("thumbnail", Namespace = "http://search.yahoo.com/mrss/")]
        public Media MediaThumbnail { get; set; }

        #endregion
    }
}
